/*
题目: 解决智力问题
给你一个下标从 0 开始的二维整数数组 questions ，其中 questions[i] = [pointsi, brainpoweri] 。

这个数组表示一场考试里的一系列题目，你需要 按顺序 （也就是从问题 0 开始依次解决），针对每个问题选择 解决 或者 跳过 操作。解决问题 i 将让你 获得  pointsi 的分数，
但是你将 无法 解决接下来的 brainpoweri 个问题（即只能跳过接下来的 brainpoweri 个问题）。如果你跳过问题 i ，你可以对下一个问题决定使用哪种操作。

https://leetcode.cn/problems/solving-questions-with-brainpower
 */
public class MostPoints {
    public long mostPoints(int[][] questions) {
        int n = questions.length;
        // 因为需要后面的数据
        //倒序 :  解决 [i, n -  1] 问题的最大分数
        long[] dp = new long[n];
        dp[n - 1] = questions[n - 1][0];

        for (int i = n - 2; i >= 0; i --) {
            // 倒序的话 : 可以跳过, 或者做任务
            int j = i + 1 + questions[i][1];  // 做这个任务后的下标
            dp[i] = Math.max(dp[i + 1], questions[i][0] + (j < n ? dp[j] : 0));
        }

        return dp[0];
    }
}
